package com.sdu.cloudservice.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期相关的工具类
 * Create by zekdot on 19-1-26.
 */
public class DateUtil {
    private static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
    private static SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static SimpleDateFormat aliFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
    /**
     * 将日期转换成字符串
     *
     * @param date
     * @return
     */
    public static String date2Str(Date date) {
        return format1.format(date);
    }

    /**
     * 将日期时间转换成字符串
     *
     * @param datetime 日期时间
     * @return 字符串
     */
    public static String dateTime2Str(Date datetime) {
        return format2.format(datetime);
    }
    /**
     * 字符串转换日期
     *
     * @param str 日期字符串
     * @return
     * @throws ParseException
     */
    public static Date str2Date(String str) throws ParseException {
        return format1.parse(str);
    }

    /**
     * 字符串转换日期时间
     * @param str 字符串
     * @return
     */
    public static Date str2DateTime(String str) throws ParseException {
        return format2.parse(str);
    }
    /**
     * 获取两个Date相差秒数
     *
     * @param start
     * @param end
     * @return
     */
    public static int getIntervalSeconds(Date start, Date end) {
        return (int) ((end.getTime() - start.getTime()) / 1000);
    }

    /**
     * 获取两个Date的相差小时数
     * @param start 开始Date
     * @param end 结束Date
     * @return
     */
    public static int getIntervalHours(Date start,Date end){
        return getIntervalSeconds(start, end) / 3600;  //计算小时数
    }
    /**
     * 获得两个Date的相差天数
     *
     * @param start 开始Date
     * @param end   结束Date
     * @return 天数
     */
    public static int getIntervalDays(Date start, Date end) {
        return getIntervalSeconds(start, end) / 3600 / 24;  //计算天数
    }

    /**
     * 计算流逝天数后的日期
     * @param day 天数
     * @param curDate 当前日期
     * @return 流逝后日期
     */
    public static Date calcElapseDay(long day,Date curDate){
        return new Date(curDate.getTime() + day * 24 * 3600 * 1000);
    }

    /**
     * 将阿里时间戳字符串转换为时间
     * @param str 时间戳字符串
     * @return 时间
     */
    public static Date aliStr2Date(String str) throws ParseException {
        return aliFormat.parse(str);
    }
    /**
     * 当前时间转换到阿里时间戳
     * @param date 当前时间
     * @return
     */
    public static String dateTime2AliStr(Date date){
        return aliFormat.format(date);
    }

    /**
     * 根据时间字符串得到最靠近的时间点字符串
     * @param timeStr 时间字符串
     * @return 字符串
     */
    public static String getNearestPoint(String timeStr) throws ParseException {
        // 获取当前日期
        Date curDate = aliStr2Date(timeStr);
        // 新建calender类
        Calendar calendar = Calendar.getInstance();
        // 放入Date类型数据
        calendar.setTime(curDate);
        // 获取分钟
        int minute = calendar.get(Calendar.MINUTE);
        // 获取秒数
        int second = calendar.get(Calendar.SECOND);
        // System.out.println("分钟为"+minute+" 秒钟为"+second);
        // 返回的日期
        Date resDate;
        if(minute %10 >= 5){
            // 上位
            resDate = new Date(curDate.getTime() + (600 - second - minute % 10 * 60) * 1000);
        }else{
            // 下位
            resDate = new Date(curDate.getTime() - (minute % 10 * 60 + second) * 1000);
        }
        // 返回转换后的字符串
        return dateTime2AliStr(resDate);
    }

    /**
     * 给出时间字符串，判断分钟是否为0
     * @param timeStr 时间字符串
     * @return 分钟是否为0
     */
    public static boolean isZeroMinute(String timeStr){
        // 获取当前日期
        Date curDate = null;
        try {
            curDate = aliStr2Date(timeStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
        // 新建calender类
        Calendar calendar = Calendar.getInstance();
        // 放入Date类型数据
        calendar.setTime(curDate);
        // 获取分钟
        int minute = calendar.get(Calendar.MINUTE);
        return minute == 0;
    }
    public static void main(String args[]) {
//        Date start = null;
//        Date end = null;
//        try {
//            start = new java.sql.Date(DateUtil.str2Date("2019-01-26").getTime());
//            end = DateUtil.str2Date("2019-01-30");
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        System.out.println(date2Str(start));
//        System.out.println(date2Str(end));
//        System.out.println(getIntervalDays(start, end));
//        System.out.println(dateTime2Str(new Date()));
//        try {
//            System.out.println(getIntervalDays(str2Date("2019-05-22"),new Date()));
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        System.out.println(date2Str(calcElapseDay(-30,new Date())));
//        System.out.println(dateTime2AliStr(new Date()));
//        try {
//            System.out.println(getNearestPoint("2019-06-14T02:51:30Z"));
//            System.out.println(getNearestPoint("2019-06-14T23:56:30Z"));
//            System.out.println(getNearestPoint("2019-06-14T23:50:30Z"));
//            System.out.println(getNearestPoint("2019-06-14T00:00:30Z"));
//            System.out.println(getNearestPoint("2019-06-14T00:55:30Z"));
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        System.out.println(isZeroMinute("2019-06-14T02:51:30Z"));
//        System.out.println(isZeroMinute("2019-06-14T02:00:30Z"));
        try {
            System.out.println(getIntervalHours(DateUtil.str2DateTime("2019-07-01 05:04:03"),new Date()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
